//
// Created by Administrator on 2020/9/18.
//

#ifndef P2PCLIENT_STUN_ATTRIBUTE_H
#define P2PCLIENT_STUN_ATTRIBUTE_H

#include "stun.h"

//stun attribute -- From RFC 8489
//0                   1                   2                   3
//0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//|            Type             |              Length           |
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//|                  Value (variable) ....
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

class StunAttribute {
public:
    StunAttribute();
    StunAttribute(uint16_t);
    StunAttribute(uint16_t, uint16_t);
    StunAttribute(const StunAttribute&);
    StunAttribute& operator=(const StunAttribute&) = delete;
    StunAttribute(const StunAttribute&&) = delete;
    StunAttribute& operator=(const StunAttribute&&) = delete;
    ~StunAttribute();

    void set_type(const uint16_t& attr_type_);
    uint16_t get_type() const;

    void set_value(uint8_t* value, uint16_t& length);
    uint8_t* get_value() const;


    char* encode16(char* buf, uint16_t data);

    char* encode32(char* buf, uint32_t data);

    bool parse(const char*, uint16_t);

    uint16_t encode(char*, uint16_t);

private:
    uint16_t attr_type_;
    uint16_t attr_length_;
    uint8_t *attr_value_;
};


#endif //P2PCLIENT_STUN_ATTRIBUTE_H
